from socket import *
from multiprocessing import Process

ADDR = ('176.233.33.11', 1942)


class User():
    def __init__(self, socket_udp, ADDR):
        """
            创建客户端套接字，绑定地址
        """
        self.socket_udp = socket_udp
        self.__addr = ADDR

    def register(self, name):
        """
            根据用户名登录聊天室,返回登录结果
        :return:
        """
        mes = 'LOGIN:' + name + ':'
        print('开始进入聊天室验证')
        socket_udp.sendto(mes.encode(), ADDR)
        print('验证结束')
        data = socket_udp.recvfrom(50)[0]
        return data.decode()

    def __chat(self, name, message):
        """
            开始聊天
        :return:
        """
        msg = f'CHAT:{name}:{message}'
        print('正在发送消息')
        socket_udp.sendto(msg.encode(), ADDR)

    def __exit(self,name):
        """
            退出聊天
        :return:
        """
        msg = f'EXIT:{name}:'
        socket_udp.sendto(msg.encode(), ADDR)
        socket_udp.close()

    def main(self, name, message):
        if message == '##':
            self.__exit(name)
        else:
            self.__chat(name, message)
            print('发送消息完成')

    def get_message(self):
        print('进程创立成功')
        while True:
            data = self.socket_udp.recvfrom(1024)[0]
            print(data.decode())


if __name__ == '__main__':
    socket_udp = socket(type=SOCK_DGRAM)
    user = User(socket_udp, ADDR)
    while True:
        name = input('请输入聊天名称')
        if user.register(name) == 'pass':
            print('已进入聊天室，开始聊天吧')
            break
        print('姓名已存在,请重新输入')

    p = Process(target=user.get_message, daemon=True)
    print('进程创立')
    p.start()

    while True:
        message = input('请输入聊天内容:')
        user.main(name, message)
        if message == '##':
            break
    print('已退出聊天室')


# 向服务器发送请求  格式“请求头：用户名：消息内容”
# 1.登录 向客户端发送登录信息 格式‘LOGIN：用户名：’
# 接收pass 或者 refuse 如果pass 程序向下执行 如果refuse 重新登录
# 2.判断 消息内容  如果不是‘##’ 请求头‘CHAT：用户名：消息内容’  跳转到聊天功能
#                如果 '##' 请求头 ‘EXIT：用户名：‘ 跳转到退出功能


